package com.stylefeng.guns.rest.modular.auth.filter;

import com.stylefeng.guns.core.base.tips.ErrorTip;
import com.stylefeng.guns.core.util.RenderUtil;
import com.stylefeng.guns.rest.common.exception.BizExceptionEnum;
import com.stylefeng.guns.rest.config.properties.JwtProperties;
import com.stylefeng.guns.rest.modular.auth.util.JwtTokenUtil;
import io.jsonwebtoken.JwtException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 对客户端请求的jwt token验证过滤器
 *
 * @author fengshuonan
 * @Date 2017/8/24 14:04
 */
public class AuthFilter extends OncePerRequestFilter {

    private final Log logger = LogFactory.getLog(this.getClass());

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    private JwtProperties jwtProperties;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request.getServletPath().equals("/" + jwtProperties.getAuthPath())) {
            chain.doFilter(request, response);
            return;
        }
       
        //========取消swagger的拦截_start=================================================
        if (request.getServletPath().equals("/swagger-ui.html")) {
        		chain.doFilter(request, response);
        		return;
        }
        
        if (request.getServletPath().contains("webjars")) {
        		chain.doFilter(request, response);
        		return;
        }
        
        if (request.getServletPath().contains("swagger-resources")) {
        		chain.doFilter(request, response);
        		return;
        }
        
        if (request.getServletPath().contains("v2")) {
        	 	chain.doFilter(request, response);
        	 	return;
        }
        
        if (request.getServletPath().contains("configuration")) {
        		chain.doFilter(request, response);
        		return;
        }
        
        	// System.out.println(request.getServletPath());
        //========取消swagger的拦截_end====================================================
        if (request.getServletPath().contains("swagger")) {
    			chain.doFilter(request, response);
    			return;
        }
        
        //========取消swagger的拦截=======================================================================
        
        
        //System.out.println(request.getServletPath());
        //========取消user的拦截_end====================================================
        if (request.getServletPath().startsWith("/user")) {
        	chain.doFilter(request, response);
        	return;
        }
        
        //========取消user的拦截=======================================================================
        
        
        
        
        
        //===============================================================================
        
        
        
        final String requestHeader = request.getHeader(jwtProperties.getHeader());
        String authToken = null;
        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
            authToken = requestHeader.substring(7);

            //验证token是否过期,包含了验证jwt是否正确
            try {
                boolean flag = jwtTokenUtil.isTokenExpired(authToken);
                if (!flag) {
                    RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_EXPIRED.getCode(), BizExceptionEnum.TOKEN_EXPIRED.getMessage()));
                    return;
                }
            } catch (JwtException e) {
                //有异常就是token解析失败
                RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
                return;
            }
        } else {
            //header没有带Bearer字段
            RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
            return;
        }
        chain.doFilter(request, response);
    }
}